﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using TCC_Hotel.Repositorio;
using System.Web.Caching;

namespace TCC_Hotel.Serviços.BDServices
{
    public class EmpresaService
    {
        EmpresaRepositorio repositorio = new EmpresaRepositorio();

        /// <summary>
        /// Retorna as empresas do banco de dados
        /// </summary>
        /// <returns>Lista com as empresas</returns>
        public List<Empresa> RecuperarEmpresas()
        {
            return repositorio.RecuperarEmpresas();
        }

        /// <summary>
        /// Retorna as empresas autorizadas para faturamento do banco de dados
        /// </summary>
        /// <returns>Lista com as empresas autorizadas</returns>
        public List<Empresa> RecuperarEmpresasAutorizadas()
        {
            return repositorio.RecuperarEmpresasAutorizadas();
        }

        /// <summary>
        /// Retorna a empresa especifica do banco de dados
        /// </summary>
        /// <returns>empresa recuperada</returns>
        public Empresa RecuperarDetalhesEmpresa(string CNPJ)
        {
            return repositorio.RecuperarDetalhesEmpresa(CNPJ);
        }

        /// <summary>
        /// Insere uma empresa no banco de dados
        /// </summary>
        /// <param name="empresa">Empresa que vai ser inserida</param>
        /// <returns>retorna true se inseriu ou false se não</returns>
        public bool CadastrarEmpresa(Empresa empresa)
        {
            return repositorio.CadastrarEmpresa(empresa);
        }

        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de empresas</returns>
        public List<Empresa> ListarEmpresasCache()
        {
            List<Empresa> empresas = new List<Empresa>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Empresa") == null)
            {
                //Consulta as empresas no banco
                empresas = RecuperarEmpresas();

                //Armazena a lista de empresas em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Empresa", empresas, null,
                                 DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                empresas = (List<Empresa>)HttpContext.Current.Cache.Get("Lista_Empresa");

            }

            return empresas;
        }

        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de empresas autorizadas</returns>
        public List<Empresa> ListarEmpresasAutorizadasCache()
        {
            List<Empresa> empresas = new List<Empresa>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Empresa_Autorizada") == null)
            {
                //Consulta as empresas no banco
                empresas = RecuperarEmpresasAutorizadas();

                //Armazena a lista de empresas em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Empresa_Autorizada", empresas, null,
                                 DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                empresas = (List<Empresa>)HttpContext.Current.Cache.Get("Lista_Empresa_Autorizada");

            }

            return empresas;
        }

        /// <summary>
        /// Serviço para nao mais autorizar a empresa à fazer faturamento
        /// </summary>
        /// <returns>true se sucesso e false se nao</returns
        public bool NaoAutorizaEmpresa(string CNPJ)
        {
            return repositorio.NaoAutorizaEmpresa(CNPJ);
        }


        /// <summary>
        /// Edita uma empresa no banco de dados
        /// </summary>
        /// <param name="empresa">nova empresa</param>
        /// <param name="CNPJ">CNPJ da empresa que vai ser editada</param>
        /// <returns>retorna true se editou ou false se não</returns>
        public bool EditarEmpresa(string CNPJ, Empresa empresa)
        {
            return repositorio.EditarEmpresa(CNPJ,empresa);
        }


        /// <summary>
        /// Verifica se o CNPJ digitado é válido
        /// </summary>
        /// <param name="pis">CNPJ digitado</param>
        /// <returns>retorna se o CNPJ é válido ou não</returns>
        public bool ValidaCNPJ(string cnpj)
        {
            int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma;
            int resto;
            string digito;
            string tempCnpj;

            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

            if (cnpj.Length != 14)
                return false;

            tempCnpj = cnpj.Substring(0, 12);

            soma = 0;
            for (int i = 0; i < 12; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            digito = resto.ToString();

            tempCnpj = tempCnpj + digito;
            soma = 0;
            for (int i = 0; i < 13; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            digito = digito + resto.ToString();

            return cnpj.EndsWith(digito);

        }





       
    }
}